﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Data;

/// <summary>
/// Summary description for servicio
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class servicio : System.Web.Services.WebService
{

    UsuarioServices UsuariosServices = new UsuarioServices();
    TipoUsuarioServices tipoUsuarioServices = new TipoUsuarioServices();
    PostServices postServices = new PostServices();
    NotificacionServices notificacionServices = new NotificacionServices();
    ComentarioServices comentarioServices = new ComentarioServices();
    BancarServices bancarServices = new BancarServices();

    public servicio()
    {
        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioNoSeguidoDTO> GetUsuariosNoSeguidos(string idUsuario, string DatosUsuario, string BuscarArtistas, string BuscarEspectadores)
    {
        DataSet ds = UsuariosServices.BuscarUsuarioNoSeguido(Convert.ToInt32(idUsuario), DatosUsuario, Convert.ToBoolean(BuscarArtistas), Convert.ToBoolean(BuscarEspectadores));
        List<UsuarioNoSeguidoDTO> usuariosNoSeguidos = new List<UsuarioNoSeguidoDTO>();

        if (ds.Tables.Count > 0)
        {
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                UsuarioNoSeguidoDTO dto = new UsuarioNoSeguidoDTO(row);
                usuariosNoSeguidos.Add(dto);
            }
        }

        return usuariosNoSeguidos;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public int InsertarNuevoUsuario(string Nombre, string Apellido, string TipoUsuarioId, string Mail, string Pass)
    {
        return UsuariosServices.AgregarUsuario(Nombre, Apellido, Convert.ToInt32(TipoUsuarioId), Mail, Pass);
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public int LogInFacebook(string Nombre, string Apellido, string Mail, string IdFacebook)
    {
        return UsuariosServices.LogInFacebook(Nombre, Apellido, Mail, IdFacebook);
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public int LogInGMail(string Nombre, string Apellido, string Mail, string IdGMail)
    {
        return UsuariosServices.LogInGMail(Nombre, Apellido, Mail, IdGMail);
    }


    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public bool NewContacto(string idUsuarioSeguidor, string idUsuarioSeguido)
    {
        int seguidor = Convert.ToInt32(idUsuarioSeguidor);
        int seguido = Convert.ToInt32(idUsuarioSeguido);
        bool respuesta = UsuariosServices.NewContacto(seguidor, seguido);
        NotificarSeguimiento(seguidor, seguido);
        return respuesta;
    }

    private void NotificarSeguimiento(int seguidor, int seguido)
    {
        notificacionServices = new NotificacionServices();
        notificacionServices.InsertarNotificacionSeguimiento(seguido, seguidor);
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public bool esSeguido(string idUsuarioLogueado, string idUsuarioEnCuestion)
    {
        int idCuestion = Convert.ToInt32(idUsuarioEnCuestion);
        int idLogueado = Convert.ToInt32(idUsuarioLogueado);
        if (idLogueado == idCuestion)
        {
            return true;
        }
        List<Usuario> usuariosSeguidos = UsuariosServices.BuscarUsuariosSeguidos(idLogueado);
        foreach (Usuario usuario in usuariosSeguidos)
        {
            if (usuario.Id_usuario == idCuestion)
            {
                return true;
            }
        }
        return false;
    }
    

    [WebMethod]
    public List<PostDTO> ObtenerPostsSeguidos(string idUsuario, int indice, int cantidad, int idLogueado)
    {
        postServices = new PostServices();
        List<Post> posts = postServices.BuscarPostSeguidosPorUsuario(Convert.ToInt32(idUsuario));

        List<PostDTO> postDTOs = CrearPostDTOs(Convert.ToInt32(idUsuario), posts);
        List<PostDTO> listaPaginada = new List<PostDTO>();

        if(postDTOs.Count < indice) {
            return new List<PostDTO>();
        }

        if (indice + cantidad > postDTOs.Count)
        {
            cantidad = postDTOs.Count - indice;
        }

        return postDTOs.GetRange(indice, cantidad);
       
    }

    [WebMethod]
    public List<PostDTO> BuscarPostDeUsuario(int idUsuario, int indice, int cantidad, int idLogueado)
    {
        postServices = new PostServices();

        List<Post> posts = postServices.BuscarPostDeUsuario(idUsuario);

        List<PostDTO> postDTOs = CrearPostDTOs(idLogueado, posts);
        List<PostDTO> listaPaginada = new List<PostDTO>();

        if (postDTOs.Count < indice)
        {
            return new List<PostDTO>();
        }

        if (indice + cantidad > postDTOs.Count)
        {
            cantidad = postDTOs.Count - indice;
        }

        return postDTOs.GetRange(indice, cantidad);

    }

    private List<PostDTO> CrearPostDTOs(int idLogueado, List<Post> posts)
    {
        List<PostDTO> postDTOs = new List<PostDTO>();

        foreach (Post post in posts)
        {
            postDTOs.Add(crearPostDTO(idLogueado, post));

        }
        return postDTOs;
    }

    private PostDTO crearPostDTO(int idLogueado, Post post)
    {
        
        Usuario usuario = UsuariosServices.BuscarUsuario(post.IdCreador);
        List<Comentario> comentarios = new List<Comentario>();
        ComentarioServices comentarioServices = new ComentarioServices();
        comentarios = comentarioServices.BuscarComentarios(post.Id);
        List<ComentarioDTO> comentariosDTO = CrearComentarioDTOs(idLogueado, comentarios);
        PostDTO postDTO = new PostDTO(post, comentariosDTO, usuario);
        postDTO.CantidadBancan = bancarServices.CantidadBancanPost(post.Id).ToString();
        postDTO.PermitirBancar = (!bancarServices.UsuarioBancandoPost(idLogueado, post.Id)).ToString();
        return postDTO;
    }

    private List<ComentarioDTO> CrearComentarioDTOs(int idLogueado, List<Comentario> comentarios)
    {
        List<ComentarioDTO> comentriosDTO = new List<ComentarioDTO>();
        foreach (Comentario comentario in comentarios)
        {
            ComentarioDTO comentarioDTO = new ComentarioDTO(comentario, UsuariosServices.BuscarUsuario(comentario.IdUsuario));
            comentarioDTO.CantidadBancan = bancarServices.CantidadBancanComentario(comentario.Id).ToString();
            comentarioDTO.PermitirBancar = (!bancarServices.UsuarioBancandoComentario(idLogueado, comentario.Id)).ToString();
            comentriosDTO.Add(comentarioDTO);
        }
        return comentriosDTO;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public int LogIn(string Mail, string Pass)
    {
        return UsuariosServices.LogIn(Mail, Pass);
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public void LogOut()
    {
        Session.Clear();
        Session.Abandon();
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public string GetNombreUsuario(string IdUsuario)
    {
        return UsuariosServices.GetNombreUsuario(Convert.ToInt32(IdUsuario));
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public UsuarioDTO TraerUsuario(string idUsuario)
    {
        
        Usuario usuario = UsuariosServices.BuscarUsuario(Convert.ToInt32(idUsuario));
        TipoUsuario tipo = tipoUsuarioServices.buscarTipoUsuarioPorDescripcion(usuario.Tipo_usuario_id);
        UsuarioDTO dto = new UsuarioDTO(usuario);
        dto.tipoUsuario = tipo.Descripcion;
        dto.TipoUsuarioId = tipo.Id.ToString();
        return dto;
    }
    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public void LeerNotificacion(int idNotificacion, int idNotificado)
    {
        NotificacionServices notifcacionServices = new NotificacionServices();
        notifcacionServices.LeerNotificacion(idNotificacion, idNotificado);
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioDTO> TraerContactos(string idUsuario, string cantidad)
    {
        List<Usuario> usuarios = UsuariosServices.BuscarUsuariosSeguidos(Convert.ToInt32(idUsuario));
        List<UsuarioDTO> usuariosDTO = new List<UsuarioDTO>();
        int unaCantidad = Convert.ToInt32(cantidad);
        if (unaCantidad > usuarios.Count)
        {
            foreach(Usuario usuario in usuarios) {
                usuariosDTO.Add(new UsuarioDTO(usuario));
            }
            return usuariosDTO;
        }
        Random random = new Random();
        
        for (int i = 0; i < unaCantidad; i++)
        {
            int next = random.Next()%usuarios.Count;
            usuariosDTO.Add(new UsuarioDTO(usuarios[next]));
            usuarios.RemoveAt(next);
        }
        return usuariosDTO;
    }


    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioDTO> TraerTodosLosContactos(string idUsuario)
    {
        List<Usuario> usuarios = UsuariosServices.BuscarUsuariosSeguidos(Convert.ToInt32(idUsuario));
        List<UsuarioDTO> usuariosDTO = new List<UsuarioDTO>();
        
            foreach (Usuario usuario in usuarios)
            {
                usuariosDTO.Add(new UsuarioDTO(usuario));
            }
            return usuariosDTO;
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public FotoDTO GetFoto(string index, string idUsuario, int idLogueado)
    {
        FotoServicio fotoServicio = new FotoServicio();
        DataSet ds = fotoServicio.GetFoto(Convert.ToInt32(index), Convert.ToInt32(idUsuario));

        FotoDTO fotoDTO = new FotoDTO();
        if (ds.Tables.Count > 0)
        {
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                fotoDTO = new FotoDTO(row);
            }
        }
        fotoDTO.CantidadBancan = bancarServices.CantidadBancanFoto(Convert.ToInt32(fotoDTO.IdFoto)).ToString();
        fotoDTO.PermitirBancar = (!bancarServices.UsuarioBancandoFoto(idLogueado, Convert.ToInt32(fotoDTO.IdFoto))).ToString();
        return fotoDTO;
    }

    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<FotoDTO> GetFotos(string idUsuario, int idLogueado)
    {
        List<FotoDTO> list = new List<FotoDTO>();
        FotoServicio fotoServicio = new FotoServicio();
        int cantidad = fotoServicio.GetCantidadFotosUsuario(Convert.ToInt32(idUsuario));
        DataSet ds;
        for (int i = 1; i <= cantidad; ++i)
        {
            ds = fotoServicio.GetFoto(i, Convert.ToInt32(idUsuario));

            if (ds.Tables.Count > 0)
            {
                foreach (DataRow row in ds.Tables[0].Rows)
                {

                    FotoDTO fotoDTO = new FotoDTO(row);
                    fotoDTO.PermitirBancar = (!bancarServices.UsuarioBancandoFoto(idLogueado, Convert.ToInt32(fotoDTO.IdFoto))).ToString();
                    fotoDTO.CantidadBancan = bancarServices.CantidadBancanFoto(Convert.ToInt32(fotoDTO.IdFoto)).ToString();
                    list.Add(fotoDTO);

                }
            }

        }
        return list;
    }


    [WebMethod]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public int GetCantidadFotosUsuario(string idUsuario)
    {
        FotoServicio fotoServicio = new FotoServicio();
        return fotoServicio.GetCantidadFotosUsuario(Convert.ToInt32(idUsuario));
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<NotificacionDTO> BuscarNotificaciones(int idUsuario)
    {
        
        List<NotificacionDTO> notificaciones = crearNotificacionesDTOs(idUsuario, notificacionServices.BuscarNotificacionesListaUsuario(idUsuario));
        return notificaciones;
    }

    private List<NotificacionDTO> crearNotificacionesDTOs(int idLogueado, List<Notificacion> notificaciones)
    {
        List<NotificacionDTO> notificacionesDTO = new List<NotificacionDTO>();
       
        foreach (Notificacion notificacion in notificaciones)
        {
            NotificacionDTO dto = new NotificacionDTO();
            dto.IdNotificacion = notificacion.IdNotificacion.ToString();
            dto.Usuario = new UsuarioDTO(UsuariosServices.BuscarUsuario(notificacion.UsuarioId));
            if(notificacion.PostId != 0)
                dto.Post = crearPostDTO(idLogueado, postServices.BuscarPost(notificacion.PostId.ToString()));
            dto.Leida = notificacion.Leida.ToString();
            dto.CodigoEvento = notificacion.CodigoEvento;
            dto.NotificadoId = notificacion.NotificadoId.ToString();
            notificacionesDTO.Add(dto);
        }
        return notificacionesDTO;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public string ContarNotificacionesNoLeidas(int idUsuario)
    {
        return notificacionServices.ContarNotificacionesNoLeidas(idUsuario).ToString();
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<NotificacionDTO> BuscarNotificacionesVer(int idUsuario)
    {
        List<NotificacionDTO> notificaciones = crearNotificacionesDTOs(idUsuario, notificacionServices.BuscarNotificacionesVer(idUsuario));
        return notificaciones;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public void BancarPost(int idPost, int idUsuario)
    {
        bancarServices.BancarPost(idPost, idUsuario); 
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public void BancarFoto(int idFoto, int idUsuario)
    {
        bancarServices.BancarFoto(idFoto, idUsuario);
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public void BancarComentario(int idComentario, int idUsuario)
    {
        bancarServices.BancarComentario(idComentario, idUsuario);
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioDTO> TraerUsuariosBancanPost(int idPost)
    {
        List<UsuarioDTO> usuarios = new List<UsuarioDTO>();
        foreach (Usuario usuario in UsuariosServices.TraerUsuariosBancanPost(idPost))
        {
            usuarios.Add(new UsuarioDTO(usuario));
        }
        return usuarios;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioDTO> TraerUsuariosBancanFoto(int idFoto)
    {
        List<UsuarioDTO> usuarios = new List<UsuarioDTO>();
        foreach (Usuario usuario in UsuariosServices.TraerUsuariosBancanFoto(idFoto))
        {
            usuarios.Add(new UsuarioDTO(usuario));
        }
        return usuarios;
    }

    [WebMethod(EnableSession = true)]
    [System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json)]
    public List<UsuarioDTO> TraerUsuariosBancanComentario(int idComentario)
    {
        List<UsuarioDTO> usuarios = new List<UsuarioDTO>();
        foreach (Usuario usuario in UsuariosServices.TraerUsuariosBancanComentario(idComentario))
        {
            usuarios.Add(new UsuarioDTO(usuario));
        }
        return usuarios;
    }
}
